package com.example.demo.controller;

import com.example.demo.common.AppVariable;
import com.example.demo.common.PasswordUtils;
import com.example.demo.common.ResultAjax;
import com.example.demo.common.SessionUtils;
import com.example.demo.model.Userinfo;
import com.example.demo.model.vo.UserinfoVO;
import com.example.demo.service.ArticleService;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private ArticleService articleService;

    /**
     * 注册功能
     * @param userinfo
     * @return
     */
    @RequestMapping("/reg")
    public ResultAjax reg(Userinfo userinfo) {
        System.out.println(userinfo.toString());
        // 1. 效验参数
        if (userinfo == null || !StringUtils.hasLength(userinfo.getUsername())
                || !StringUtils.hasLength(userinfo.getPassword())
                || !StringUtils.hasLength(userinfo.getType())) {
            // 参数异常
            return ResultAjax.fail(-1,"非法参数");
        }
        // 密码（加盐）
        userinfo.setPassword(PasswordUtils.encrypt(userinfo.getPassword()));
        //设置身份
        if (userinfo.getType().equals("1")) {
            userinfo.setType("reader");
        }
        if (userinfo.getType().equals("2")) {
            userinfo.setType("writer");
            int result = userService.addWriter(userinfo);
            return ResultAjax.succ(result+1);
        }
        // 设置时间
        LocalDateTime date = LocalDateTime.now();
        userinfo.setUpdatetime(date);
        // 2. 请求 service 进行添加操作
        int result = userService.reg(userinfo);
        // 3. 将执行的结果返回给前端
        return ResultAjax.succ(result);
    }


    /**
     * 登录接口
     * @param userinfoVO
     * @return
     */
    @RequestMapping("/login")
    public ResultAjax login(UserinfoVO userinfoVO, HttpServletRequest request) {
        // 1. 参数效验(非空)
        if (userinfoVO == null || !StringUtils.hasLength(userinfoVO.getUsername()) ||
                !StringUtils.hasLength(userinfoVO.getPassword())) {
            // 非法登录
            return ResultAjax.fail(-1,"错误参数！");
        }
        // 2. 根据用户名查询对象
        Userinfo userinfo = userService.getUserByName(userinfoVO.getUsername());
        if (userinfo == null || userinfo.getId() == 0) {
            // 不存在
            return ResultAjax.fail(-2,"用户名或密码错误！");
        }

        // 这里加一个用户状态是否正常
        if (userinfo.getState().equals("0")) {
            return ResultAjax.fail(-3,"该用户涉及违规，已被封禁！！！");
        }

        // 3. 使用对象中的密码和用户输入的密码进行比较
        // 验证密码（加盐解密）
        if (!PasswordUtils.decrypt(userinfoVO.getPassword(),userinfo.getPassword())) {
            // 密码错误
            return ResultAjax.fail(-2,"用户名或密码错误！");
        }
        // 4. 比较成功后，将对象存储到 session 中
        HttpSession session = request.getSession();
        session.setAttribute(AppVariable.SESSION_USERINFO_KEY,userinfo);
        // 5. 将结果返回给用户
        // 走到这，用户名和密码一定是正确的，成功方法 data 给个 1
        return ResultAjax.succ(userinfo.getType());
    }

    /**
     * 注销
     * @param request
     * @return
     */
    @RequestMapping("/logout")
    public ResultAjax logout(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null && session.getAttribute(AppVariable.SESSION_USERINFO_KEY) != null) {
            session.removeAttribute(AppVariable.SESSION_USERINFO_KEY);
        }
        return ResultAjax.succ(1);
    }


    /**
     * 重置密码
     * @param userinfo
     * @return
     */
    @RequestMapping("/recover")
    public ResultAjax recover(Userinfo userinfo) {
        if (userinfo == null || !StringUtils.hasLength(userinfo.getUsername())
                || !StringUtils.hasLength(userinfo.getPassword())) {
            return ResultAjax.fail(-1,"参数错误");
        }
        // 密码（加盐）
        userinfo.setPassword(PasswordUtils.encrypt(userinfo.getPassword()));
        // 设置时间
        LocalDateTime dateTime = LocalDateTime.now();
        userinfo.setUpdatetime(dateTime);
        int result = userService.recover(userinfo);
        return ResultAjax.succ(result);
    }


    /**
     * 修改用户信息
     * @param userinfo
     * @param request
     * @return
     */
    @RequestMapping("/updateuser")
    public ResultAjax updateUser (Userinfo userinfo, HttpServletRequest request) {
        // 1. 参数效验
        if (userinfo == null || !StringUtils.hasLength(userinfo.getUsername())
                || !StringUtils.hasLength(userinfo.getPassword())) {
            return ResultAjax.fail(-1,"参数错误");
        }

        // 获取当前用户 id
        Userinfo userinfo1 = SessionUtils.getUser(request);
        if (userinfo1 == null || userinfo1.getId() <= 0) {
            return ResultAjax.fail(-2,"请先登录！");
        }

        // 组装数据
        userinfo.setId(userinfo1.getId());
        LocalDateTime dateTime = LocalDateTime.now();
        userinfo.setUpdatetime(dateTime);

        // 修改并返回
        int result = userService.updateUser(userinfo);
        return ResultAjax.succ(result);
    }


    /**
     * 上传头像
     * @param file
     * @return
     */
    @RequestMapping("/upload")
    public ResultAjax upload(MultipartFile file,HttpServletRequest request) {
        // 获取文件名
        String fileName = file.getOriginalFilename();
        // 指定文件存储路径
        String filePath = "C:/Users/15085202591/Desktop/Mycode/books-recommend/src/main/resources/static/img/" + fileName;
        System.out.println(fileName);
        // 把文件名存到 数据库中
        Userinfo userinfo = SessionUtils.getUser(request);
        if (userinfo == null) {
            return ResultAjax.fail(-2,"请先登录！");
        }
        userinfo.setPhoto(fileName);
        LocalDateTime dateTime = LocalDateTime.now();
        userinfo.setUpdatetime(dateTime);
        int result = userService.setUserPhoto(userinfo);
        if (result <= 0) {
            return ResultAjax.fail(-1,"更新失败！");
        }
        File dest = new File(filePath);
        // 保存文件
        try {
            file.transferTo(dest);
            return ResultAjax.succ(fileName);
        } catch (IOException e) {
            return ResultAjax.fail(-1,"上传失败");
        }
    }


    /**
     * 初始展示用户头像
     * @param request
     * @return
     */
    @RequestMapping("/photo")
    public ResultAjax initPhoto(HttpServletRequest request) {
        // 获取当前用户
        Userinfo userinfo = SessionUtils.getUser(request);
        System.out.println(userinfo.toString());
        if (userinfo == null) {
            return ResultAjax.fail(-2,"请先登录");
        }
        return ResultAjax.succ(userinfo.getPhoto());
    }


    /**
     * 根据不同的文章找到作者头像展示
     * @param aid
     * @return
     */
    @RequestMapping("/photoall")
    public ResultAjax initPhotoByAid(Integer aid) {
        // 效验参数
        if (aid <= 0) {
            return ResultAjax.fail(-1,"参数错误");
        }
        Integer id = articleService.getUidByAid(aid);
        Userinfo userinfo = userService.getUserById(id);
        if (userinfo == null) {
            return ResultAjax.fail(-2,"请先登录");
        }
        return ResultAjax.succ(userinfo.getPhoto());
    }


}
